<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            // 基础字段
            $table->id()->comment('产品ID');
            $table->string('name')->comment('产品名称');
            $table->string('slug')->unique()->comment('URL别名，用于SEO友好的URL');
            $table->text('description')->nullable()->comment('产品详细描述');
            $table->text('long_description')->nullable()->comment('产品长描述，详细介绍');
            $table->text('short_description')->nullable()->comment('产品简短描述，用于列表页显示');
            $table->string('sku')->unique()->comment('产品SKU，库存管理单位');
            
            // 价格相关字段
            $table->decimal('price', 10, 2)->unsigned()->comment('产品价格，单位：元');
            $table->decimal('compare_price', 10, 2)->unsigned()->nullable()->comment('原价，用于显示折扣');
            $table->decimal('cost_price', 10, 2)->unsigned()->nullable()->comment('成本价格，用于利润计算');
            
            // 库存相关字段
            $table->integer('stock_quantity')->unsigned()->default(0)->comment('库存数量');
            $table->integer('low_stock_threshold')->unsigned()->default(5)->comment('低库存阈值，低于此数量时提醒');
            
            // 物理属性字段（优化后的精确类型）
            $table->decimal('weight', 8, 3)->nullable()->comment('重量，单位：千克，精确到克');
            $table->decimal('length', 8, 2)->nullable()->comment('长度，单位：厘米');
            $table->decimal('width', 8, 2)->nullable()->comment('宽度，单位：厘米');
            $table->decimal('height', 8, 2)->nullable()->comment('高度，单位：厘米');
            
            // 产品信息字段
            $table->string('brand')->nullable()->comment('品牌名称');
            $table->string('model')->nullable()->comment('产品型号');
            
            // JSON 存储字段
            $table->json('specifications')->nullable()->comment('产品规格参数，JSON格式存储');
            $table->json('features')->nullable()->comment('产品特性，JSON数组格式');
            $table->json('tags')->nullable()->comment('产品标签，JSON数组格式');
            $table->json('meta_data')->nullable()->comment('扩展元数据，JSON格式');
            
            // 状态字段
            $table->boolean('is_active')->default(true)->comment('是否启用，false表示下架');
            $table->boolean('is_featured')->default(false)->comment('是否推荐，用于首页展示');
            $table->boolean('is_digital')->default(false)->comment('是否数字产品，如软件、电子书等');
            $table->boolean('requires_shipping')->default(true)->comment('是否需要配送，数字产品通常为false');
            
            // 产品类型字段
            $table->enum('product_type', ['single', 'multi_variant'])->default('single')->comment('产品类型：single=单规格产品，multi_variant=多规格产品');
            
            // 排序和发布字段
            $table->integer('sort_order')->default(0)->comment('排序权重，数值越大排序越靠前');
            $table->timestamp('published_at')->nullable()->comment('发布时间，null表示未发布');
            
            // SEO 相关字段
            $table->string('meta_title')->nullable()->comment('SEO标题，用于搜索引擎优化');
            $table->text('meta_description')->nullable()->comment('SEO描述，用于搜索引擎优化');
            $table->json('meta_keywords')->nullable()->comment('SEO关键词，JSON数组格式');
            $table->string('canonical_url')->nullable()->comment('规范URL，用于避免重复内容');
            
            // 变体管理字段
            $table->boolean('has_custom_variants')->default(false)->comment('是否有自定义变体，用于标识产品是否有特殊变体');
            $table->json('default_specifications')->nullable()->comment('默认规格配置，JSON格式');
            
            // 规格模板关联
            $table->foreignId('template_id')->nullable()->constrained('specification_templates')->onDelete('set null')->comment('规格模板ID');
            
            // 审计字段
            $table->unsignedBigInteger('created_by')->nullable()->comment('创建人ID，关联用户表');
            $table->unsignedBigInteger('updated_by')->nullable()->comment('更新人ID，关联用户表');
            
            // 软删除和时间戳
            $table->softDeletes()->comment('软删除时间戳');
            $table->timestamps();
            
            // 索引优化
            $table->index(['is_active', 'is_featured'], 'idx_active_featured')->comment('状态和推荐组合索引，用于首页推荐产品查询');
            $table->index(['price', 'is_active'], 'idx_price_active')->comment('价格和状态组合索引，用于价格排序查询');
            $table->index(['stock_quantity', 'is_active'], 'idx_stock_active')->comment('库存和状态组合索引，用于库存管理查询');
            $table->index(['published_at', 'is_active'], 'idx_published_active')->comment('发布时间和状态组合索引，用于新品查询');
            $table->index(['product_type', 'is_active'], 'idx_type_active')->comment('产品类型和状态组合索引，用于分类查询');
            $table->index(['brand', 'is_active'], 'idx_brand_active')->comment('品牌和状态组合索引，用于品牌筛选');
            $table->index(['created_at', 'is_active'], 'idx_created_active')->comment('创建时间和状态组合索引，用于时间排序');
            $table->index('sku', 'idx_sku')->comment('SKU唯一索引，用于库存管理');
            $table->index('slug', 'idx_slug')->comment('URL别名索引，用于SEO查询');
            $table->index('created_by', 'idx_created_by')->comment('创建人索引，用于审计查询');
            $table->index('template_id')->comment('规格模板索引');
            
            // 全文搜索索引
            $table->fullText(['name', 'description', 'sku'], 'products_fulltext_index')->comment('全文搜索索引，用于产品搜索');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};
